package negocio;


import integracion.AdministradorLogBean;
import interfaces.AdministradorLog;
import interfaces.AdministradorVenta;
import interfaces.ProcesarVenta;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import constantes.ConstantesConfig;
import dtos.VentaDTO;
import entities.Articulo;
import entities.ItemVenta;
import entities.Usuario;

/**
 * Session Bean implementation class ProcesarVentaBean
 */
@Stateful
public class ProcesarVentaBean implements ProcesarVenta {
	
	@PersistenceContext
	EntityManager em;
	
	@EJB
	private AdministradorLog admLog;
	
	@EJB
	private AdministradorVenta admVenta;
	
	private List<ItemVenta> carrito ;
	
	private Usuario usuario;

	private static Logger log4j = Logger.getLogger(ProcesarVentaBean.class);
	
	public ProcesarVentaBean () {
		carrito = new ArrayList<ItemVenta>();
	}
	
	public boolean iniciar(String usr) {
    	Query q = em.createQuery("select DISTINCT u from Usuario u where u.login=:usr")
    			.setParameter("usr", usr);
    	Object u ;
        try{
        	u = q.getSingleResult();
        	if(u!=null){
        		usuario = (Usuario) u;
        		//Logueo
        		String estado = "OK";
        		String mensaje = "Se inicio Venta para el usuario: " + usuario.getNombre();
        		
        		admLog.persistirLogClienteCompleto(estado,mensaje);
        		return true;
        	}else{
        		String estado = "ERROR";
        		String mensaje = "Usuario inexistente";
        		
        		admLog.persistirLogClienteCompleto(estado,mensaje);
        		return false;
        	}
        }catch(Exception e){
        	String estado = "ERROR";
    		String mensaje = "Usuario inexistente";
    		
    		admLog.persistirLogClienteCompleto(estado,mensaje);
        	return false;
        }
	}
	
	public List<ItemVenta> obtenerItemsCarrito() {
		return carrito;
	}
	
	public double agregarIteamAlCarrito(int codigo, int cantidad) {
		for(ItemVenta it: carrito){
			if(it.getCodigoArticulo() == codigo){
				String mensaje = "Se cambio la cantidad del articulo: " + it.getArticulo().getDescripcion() + " de: " + it.getCantidad() + " a: " + cantidad +" - Modulo: " + ConstantesConfig.ID_MODULO;
				admLog.enviarLogSegunConfig( mensaje );
				it.setCantidad(cantidad);
				String estado = "OK";
        		
        		admLog.persistirLogClienteCompleto(estado,mensaje);
        		log4j.info("Se cambio la cantidad");
				return it.getSubtotal();
			}
		}
		ItemVenta iv = new ItemVenta();
		Articulo a ;
		a = em.find( Articulo.class, codigo);
		if(a != null){
			iv.setArticulo(a);
			iv.setCantidad(cantidad);
			carrito.add(iv);

			//Logueo
			String mensaje = "Se agrego el articulo: " + a.getDescripcion() + " al carrito - Modulo: " + ConstantesConfig.ID_MODULO;
			String estado = "OK";
			
			//Log a enviar
			admLog.enviarLogSegunConfig( mensaje );
			
			//Log Nuestro
			admLog.persistirLogClienteCompleto(estado,mensaje);
			log4j.info("Se agrego un item al carrito");
			
			return cantidad*a.getPrecio();
		}
		return 0;
	}
	
	public void eliminarItemCarrito(int codigo){
		ItemVenta delete = new ItemVenta() ;
		for(ItemVenta it : carrito){
			if(it.getCodigoArticulo() == codigo){
				delete = it;
			}
		}
		if(delete.getCodigoArticulo() == codigo){
			carrito.remove(delete);
			String mensaje = "Se elimino el articulo: " + codigo + " al carrito - Modulo: " + ConstantesConfig.ID_MODULO;
			String estado = "OK";
			
			//Log a Enviar
			admLog.enviarLogSegunConfig( mensaje );
			
			//Log Nuestro
			admLog.persistirLogClienteCompleto(estado,mensaje);
			
			log4j.info("Se elimino un item al carrito");
		}
	}
	
	public VentaDTO confirmarCompra() {

		VentaDTO ventaDTO = admVenta.guardarVenta(carrito, usuario);
		carrito = new ArrayList<ItemVenta>();
		if(ventaDTO != null)
			return ventaDTO;
		else
			return null;
	}

	
	public void cancelarVenta() {
		/*		Usuario u = venta.getUsuario();
		venta = new Venta();
		venta.setUsuario(u);
		em.detach(venta.getItemsVenta());
		em.detach(venta);
		
		try{
			admLog.enviarLogSegunConfig("El usuario " + u.getNombre() + " ha cancelado la venta");
		}catch(Exception e){}
		
	*/}


	
}
